Ziskani focusu
Otázka od: Ing. Igor Kapoun
6. 9. 2004 12:13
Potreboval bych, aby moje aplikace v urcitem bode programu ziskala focus
podobne, jako kdybych na ni kliknul mysi.
Dik za nakopnuti.
Igor
Odpovedá: Jiri Cincura
6. 9. 2004 12:39
Ing. Igor Kapoun wrote:
> Potreboval bych, aby moje aplikace v urcitem bode programu ziskala focus
> podobne, jako kdybych na ni kliknul mysi. Dik za nakopnuti.
> Igor
SetForegroundWindow by nepomohlo?
--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web: http://www.cincura.net; http://photo.cincura.net
Odpovedá: Sebesta Jan
6. 9. 2004 12:31
neco.setfocus -staci?
-----Original Message-----
From: delphi-l-owner@clexpert.cz [mailto:delphi-l-owner@clexpert.cz] On
Behalf Of Ing. Igor Kapoun
Sent: Monday, September 06, 2004 12:47 PM
To: delphi-l@clexpert.cz
Subject: Ziskani focusu
Potreboval bych, aby moje aplikace v urcitem bode programu ziskala focus
podobne, jako kdybych na ni kliknul mysi.
Dik za nakopnuti.
Igor
Odpovedá: Karel Halamasek
6. 9. 2004 13:40
Staci napsat napriklad:
DBEdit1.SetFocus; // fokus na zvoleny objekt
Karel Halamasek
Dne Mon, 6 Sep 2004 13:25:25 +0200 napsal/-a Sebesta Jan <sebesta@cube.cz>
zpravu nasledujiciho zneni:
> neco.setfocus -staci?
>
> -----Original Message-----
> From: delphi-l-owner@clexpert.cz [mailto:delphi-l-owner@clexpert.cz] On
> Behalf Of Ing. Igor Kapoun
> Sent: Monday, September 06, 2004 12:47 PM
> To: delphi-l@clexpert.cz
> Subject: Ziskani focusu
>
> Potreboval bych, aby moje aplikace v urcitem bode programu ziskala focus
> podobne, jako kdybych na ni kliknul mysi.
> Dik za nakopnuti.
> Igor
>
>
>
>
>
>
>
>
--
Preji hezky den.
Karel Halamasek COMPRO
Odpovedá: Jiri Cincura
6. 9. 2004 14:22
Sebesta Jan wrote:
> neco.setfocus -staci?
>
Myslim, ze tazatel myslel celou app, kdyz je treba prekryta jinou, ne? Nebo
jen prvek na formu?
--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web: http://www.cincura.net; http://photo.cincura.net
Odpovedá: Ing. Igor Kapoun
6. 9. 2004 14:44
Diky vsem za podnety. Jedna se o focus aplikace, nikoli VCL komponenty.
> SetForegroundWindow by nepomohlo?
Zkousel jsem toto:
if SetForegroundWindow (Application.Handle)
then Caption := 'OK'
else Caption := SysErrorMessage(GetLastError);
Pokud melo okno aplikace focus, bylo to OK, jak jsem aktivoval jinou
aplikaci, chybova hlaska byla "Parametr neni spravny"
Odpovedá: Pavol Stugel, NETGraphics
6. 9. 2004 15:19
ShowWindow(Application.Handle, SW_SHOW);
palo
> Diky vsem za podnety. Jedna se o focus aplikace, nikoli VCL komponenty.
Odpovedá: Jiri Cincura
6. 9. 2004 15:34
Ing. Igor Kapoun wrote:
> Diky vsem za podnety. Jedna se o focus aplikace, nikoli VCL komponenty.
>
>> SetForegroundWindow by nepomohlo?
>
> Zkousel jsem toto:
>
> if SetForegroundWindow (Application.Handle)
> then Caption := 'OK'
> else Caption := SysErrorMessage(GetLastError); Pokud melo okno
> aplikace focus, bylo to OK, jak jsem aktivoval jinou aplikaci, chybova
> hlaska byla "Parametr neni spravny"
Me to hlasi "Operace byla dokoncena uspesne". Ale okno jen blika na panelu.
Bezi to na WinXP. Ale pouze pokud se prepnu do Delphi.
OK mi to hlasi, kdyz jsem v jine app a dokonce se i prenese do popredi.
Kde to volas? Nekde bude asi problem, nebo zkus nastavit jako HWND
Form1.Handle (uprav podle sebe).
--
Jiri Cincura
e-mail: mailto:jiri@cincura.net; mailto:xcincura@informatics.muni.cz
ICQ: 314711544
web: http://www.cincura.net; http://photo.cincura.net
Odpovedá: Petr Vones
6. 9. 2004 15:28
From: "Jiri Cincura" <diskuze@cincura.net>
> Me to hlasi "Operace byla dokoncena uspesne". Ale okno jen blika na panelu.
> Bezi to na WinXP. Ale pouze pokud se prepnu do Delphi.
viz TJclAppInstances.BringAppWindowToFront v JCL
Petr Vones
Odpovedá: Ing. Igor Kapoun
6. 9. 2004 15:36
> > if SetForegroundWindow (Application.Handle)
> > then Caption := 'OK'
> > else Caption := SysErrorMessage(GetLastError); Pokud melo okno
> Me to hlasi "Operace byla dokoncena uspesne". Ale okno jen blika na
panelu.
> Bezi to na WinXP. Ale pouze pokud se prepnu do Delphi.
>
> OK mi to hlasi, kdyz jsem v jine app a dokonce se i prenese do popredi.
>
> Kde to volas? Nekde bude asi problem, nebo zkus nastavit jako HWND
> Form1.Handle (uprav podle sebe).
W98, D6,
V aplikaci mam jediny timer, ktery tika po 10 sec. a provadi vyse uvedeny
kok. Kdyz to sam zafocusuji, tak je to OK, jinak "Parametr neni spravny", a
blika na panelu...
Kdyz zkusim
if ShowWindow(Application.Handle, SW_SHOW)
then Caption := 'OK'
else Caption := SysErrorMessage(GetLastError);
tak je to OK porad, na panelu neblika nic, ale nic se taky nefocusuje.
Igor
Odpovedá: Pavol Stugel, NETGraphics
6. 9. 2004 15:50
> Kdyz zkusim
>
> if ShowWindow(Application.Handle, SW_SHOW)
> then Caption := 'OK'
> else Caption := SysErrorMessage(GetLastError);
> tak je to OK porad, na panelu neblika nic, ale nic se taky nefocusuje.
>
tak toto uz musi fachat:
function ForceForeground(const Handle1: THandle): Boolean;
const
SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
var
ForegndThreadID: DWORD;
TheThreadID : DWORD;
timeout : DWORD;
OSVersionInfo: TOSVersionInfo;
hParent: THandle;
AniInfo: TAnimationInfo;
Animate: Boolean;
begin
if IsIconic(Handle1) then ShowWindow(Handle1, SW_RESTORE);
hParent := GetWindowLong(Handle1, GWL_HWNDPARENT);
if hParent > 0 then
if IsIconic(hParent) then ShowWindow(hParent, SW_RESTORE);
if (GetForegroundWindow = Handle1) then Result := true
else
begin
OSVersionInfo.dwOSVersionInfoSize := SizeOf(OSVersionInfo);
GetVersionEx(OSVersionInfo);
if ((OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) and
(OSVersionInfo.dwMajorVersion > 4))
or
((OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS) and
((OSVersionInfo.dwMajorVersion > 4)
or
((OSVersionInfo.dwMajorVersion = 4) and (OSVersionInfo.dwMinorVersion >
0))))
then
begin // OS is above win 95
Result := false;
ForegndThreadID := GetWindowThreadProcessID(GetForegroundWindow,nil);
TheThreadID := GetWindowThreadProcessId(Handle1,nil);
if AttachThreadInput(TheThreadID, ForegndThreadID, true) then
begin
SetForegroundWindow(Handle1);
AttachThreadInput(TheThreadID, ForegndThreadID, false);
Result := (GetForegroundWindow = Handle1);
end;
if not Result then
begin
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, nil,
SPIF_SENDCHANGE);
SetForegroundWindow(Handle1);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, @timeout,
SPIF_SENDCHANGE);
end;
end else // OS is above win 95
SetForegroundWindow(Handle1);
Result := (GetForegroundWindow = Handle1);
if Result then Exit;
AniInfo.cbSize := SizeOf(TAnimationInfo);
if SystemParametersInfo(SPI_GETANIMATION, SizeOf(AniInfo), @AniInfo, 0) then
Animate := AniInfo.iMinAnimate <> 0 else
Animate := False;
if Animate then
begin
AniInfo.iMinAnimate := 0;
SystemParametersInfo(SPI_SETANIMATION, SizeOf(AniInfo), @AniInfo, 0);
end;
SendMessage(Handle1,WM_SYSCOMMAND,SC_MINIMIZE,0);
Sleep(40);
if hParent > 0 then
SendMessage(hParent,WM_SYSCOMMAND,SC_RESTORE,0)
else
SendMessage(Handle1,WM_SYSCOMMAND,SC_RESTORE,0);
if Animate then
begin
AniInfo.iMinAnimate := 1;
SystemParametersInfo(SPI_SETANIMATION, SizeOf(AniInfo), @AniInfo, 0);
end;
Result := (GetForegroundWindow = Handle1);
end;
end;
palo